<script>
  const arr = [1, 2, 3, 4, 5] // key只能输数字
  const obj = {
    // key只能是字符串，如果不是字符串会隐式转为字符串
    name: 'zll',
    age: 24,
    1: 33,
  }
  console.log(arr)
  console.log(obj)
  const map = new Map() // key可以是任意的类型,可以看作是一个高级的对象
  map.set(obj, '222')
  console.log(map)
  const weakMap = new WeakMap() // weackMap的key只能是对象类型
  weakMap.set(obj, '111')
  // weakMap.set('name', 'zll') // 报错
  console.log(weakMap)

  {
    const weakMap2 = new WeakMap()
    ;(function () {
      const obj = {
        name: 'zll',
        age: 24,
      }
      
      // 由于weakMap2建立的是弱引用关系，在立执行函数执行完毕后obj所占用的内存空间会被释放
      weakMap2.set(obj, '111')
    })()
    console.log(weakMap2)
  }

  {
    const map2 = new Map()
    ;(function () {
      const obj = {
        name: 'zll',
        age: 24,
      }
      // 但是由于map2.set(obj, '111')中的obj是一个对象，对象是引用类型，所以在自执行函数执行完毕后，obj会被销毁，
      // 但是map2中还存在对obj的引用，所以obj占用的空间没有倍释放，可能会导致内存泄漏，
      map2.set(obj, '111')
    })()
    console.log(map2)
  }
</script>
